C# wpf 实现自定义倒计时MessageBox

您所在的位置:网站首页 手势点击 圆形倒计时 青少年弹窗 C# wpf 实现自定义倒计时MessageBox

C# wpf 实现自定义倒计时MessageBox

2024-07-12 10:17:48| 来源: 网络整理| 查看: 265

WPF 自定义MessageBox系列

第一节 简单MessageBox 第二节 倒计时MessageBox(本节) 第三节 自定义按钮的MessageBox 第四节 界面操作分离的MessageBox 第五节 替换系统的MessageBox

文章目录 WPF 自定义MessageBox系列前言一、代码1、MessageBox.xaml2、MessageBox.xaml.cs 二、效果预览三、调用方法总结

前言

本篇是在上一篇《C# wpf 实现简单自定义MessageBox》的基础上添加倒计时功能,有些应用场景会使用倒计时的消息框,这种通常需要我们自己实现,一般使用定时器就可以很容易实现倒计时的消息框了。

一、代码 1、MessageBox.xaml 2、MessageBox.xaml.cs using System; using System.ComponentModel; using System.Windows; using System.Windows.Threading; namespace WpfApp1 { public class MessageResult { /// /// 结果,Yes为true,No为false /// public bool IsYes { get; set; } public TimeSpan YesLeftTime { get; set; } public TimeSpan NoLeftTime { get; set; } } public class MessageBoxEventArgs : EventArgs { /// /// 结果,Yes为true,No为false /// public MessageResult Result { get; set; } } /// /// MessageBox.xaml 的交互逻辑 /// public partial class MessageBox : Window, INotifyPropertyChanged { public event EventHandler Result; public event PropertyChangedEventHandler PropertyChanged; public string Context { get { return TB_Context.Text; } set { TB_Context.Text = value; } } TimeSpan _yesLeftTime = TimeSpan.FromSeconds(-1); public TimeSpan YesLeftTime { get { return _yesLeftTime; } set { _yesLeftTime = value; PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("YesLeftTime"));} } TimeSpan _noLeftTime= TimeSpan.FromSeconds(-1); public TimeSpan NoLeftTime { get { return _noLeftTime; } set { _noLeftTime = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("NoLeftTime")); } } bool _isLegal = false; DispatcherTimer _timer; public MessageBox() { InitializeComponent(); DataContext = this; } public static void Show(string context, EventHandler result) { var mb = new MessageBox(); mb.Context = context; mb.Result += result; mb.Show(); } public static MessageResult ShowDialog(string context) { return ShowDialog(context,null,null); } public static MessageResult ShowDialog(string context,TimeSpan ?yestCountDown, TimeSpan? noCountDown) { var mb = new MessageBox(); mb.Context = context; MessageResult r = null; if(yestCountDown!=null) { mb.YesLeftTime = yestCountDown.Value; } if (noCountDown != null) { mb.NoLeftTime = noCountDown.Value; } mb.Result += (s, e) => { r = e.Result; }; mb.ShowDialog(); return r; } private void No_Button_Click(object sender, RoutedEventArgs e) { _isLegal = true; Close(); Result?.Invoke(this, new MessageBoxEventArgs() { Result = new MessageResult() { IsYes=false, YesLeftTime=this.YesLeftTime, NoLeftTime= this.NoLeftTime } }); } private void Yes_Button_Click(object sender, RoutedEventArgs e) { _isLegal = true; Close(); Result?.Invoke(this, new MessageBoxEventArgs() { Result = new MessageResult() { IsYes = true, YesLeftTime = this.YesLeftTime, NoLeftTime = this.NoLeftTime } }); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = !_isLegal; } private void Window_Loaded(object sender, RoutedEventArgs e) { if(YesLeftTime.TotalSeconds>0||NoLeftTime.TotalSeconds > 0) { _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += (S, E) => { if (YesLeftTime.TotalSeconds > 0) { YesLeftTime = YesLeftTime.Add(-TimeSpan.FromSeconds(1)); } else if (YesLeftTime.TotalSeconds == 0) { _timer.Stop(); Yes_Button_Click(null, null); } if (NoLeftTime.TotalSeconds > 0) { NoLeftTime = NoLeftTime.Add(-TimeSpan.FromSeconds(1)); } else if (NoLeftTime.TotalSeconds == 0) { _timer.Stop(); No_Button_Click(null, null); } }; _timer.Start(); } } } } 二、效果预览

在这里插入图片描述 在这里插入图片描述

三、调用方法

Yes倒计时30秒

var r = MessageBox.ShowDialog("Ensure?",TimeSpan.FromSeconds(30), null); if (r.IsYes) { //选择了Yes } else { //选择了No }

No倒计时30秒

var r = MessageBox.ShowDialog("Ensure?",null,TimeSpan.FromSeconds(30)); if (r.IsYes) { //选择了Yes } else { //选择了No } 总结

使用了DispatcherTimer作为定时器,不用关系线程切换问题。总的来说还是比较容易实现的,虽然调用接口实现的比较简单,而且也考虑过按照系统的MessageBox接口来实现一套。但是个人认为Windows的MessageBox参数有点过于复杂,尤其是,OK、Cancel、Yes、No那一系列的按钮。与其使用那些固定的按钮,还不如定义几个灵活简单的可定制按钮。当然本篇文帐并没有做到这一点,这个将在下一篇文章中实现。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭